#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 10100;
const int M = 100100;
int n;
int e[M], ne[M], h[N], idx;
int ti[N]; // id -> time 每个点所需要的时间
int Com[N]; // 记录每个点完成的最快时间 
int d[N]; // 记录某个点的入度个数 
int ans; // 答案
void add(int a, int b)
{
	e[idx] = b;
	ne[idx] = h[a];
	h[a] = idx ++;
}
void to_polo()
{
	queue<int> q;
	for(int i = 1; i <= n; i++)
	{
		if(d[i] == 0) 
		{
			q.push(i); 
			Com[i] = ti[i];
			ans = max(ans, Com[i]);
		}
	}
	while(q.size())
	{
		int t = q.front();
		q.pop();
		for(int i = h[t]; i != -1; i = ne[i])
		{
			int j = e[i];
			Com[j] = max(Com[t], Com[j]); // 必须考虑最差情况
			d[j] --;
			if(!d[j])
			{
				Com[j] += ti[j];
				ans = max(ans, Com[j]);
				q.push(j);
			}
		}
	}
	cout << ans;
}
int main()
{
	memset(h, -1, sizeof h);
	cin >> n;
	for(int i = 1; i <= n; i++) 
	{
		int id, tim, tmp;
		cin >> id >> tim;
		ti[id] = tim;
		while(cin >> tmp)
		{
			if(tmp == 0) break;
			add(tmp, id);
			d[id] ++;
		}
	}
	to_polo();
	return 0;
}